package com.hsj;

/**
 * 1。单例模式
 * 确保一个类 只有一个实例， 并且自行实例化，并向整个系统提供这个实例
 *  单例模式 ：确保一个类 只有一个实例存在，例如 序列号生成器、 web计数器、访问数据库资源、访问IO 减少资源消耗
 *
 * 单例模式 在 多JVM 和 分布式系统 中 不能保证单例
 * 使用 volatile 和 双检锁 只能保证多线程 单实例
 */
public class _01_Singleton {
    private static _01_Singleton singleton;

    private _01_Singleton() {
    }

    public synchronized static _01_Singleton getInstance() {
        if (singleton == null) {
            singleton = new _01_Singleton();  //懒汉
        }
        return singleton;
    }
}

// 双检锁，减小加锁范围
class Singleton1 {
    private volatile static Singleton1 singleton;

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        if (singleton == null) {
            synchronized (_01_Singleton.class) {
                if (singleton == null) {  //双重检查锁
                    singleton = new Singleton1();
                }
            }
        }
        return singleton;
    }
}